#include "device_usart.h"
#include "device.h"
#include "modbus.h"
#include "crc.h"

uchar uart0_sendtimeout = 100;                    //串口发送超时时间,ms

uchar REN0 = 1;                                  //允许接收
uchar  uart0_len = 0;                            // 已接收/或要发送长度
uchar  uart0_buf[UART0_BUF_SIZE];                // uart0发送/接收缓冲区
uchar *uart0_tx_ptr;                             // 发送指针
bit uart0_rx_pending = 0;                        // uart0正在接收标志
bit uart0_tx_pending = 0;                        // uart0正在发送标志
bit uart0_delay_process = 0;                     // uart0指令延时处理
uchar  uart0_len_len = 0;
ushort uart0_timestamp;                          // 最后接收时间

//使能发送空中断
HAL_StatusTypeDef USART0_Send_Date(uchar *data,uchar number)
{
    /* enable USART TBE interrupt */
    usart_interrupt_enable(USART0, USART_INT_TBE);
    return HAL_OK;
}

// uart0接收到了帧结束
bit Uart0_FrameEnded(void)
{
    return timer_flag_get(TIMER5, TIMER_FLAG_UP);
}

bit Uart0_Send_Message(void)
{
    ushort interval;
    HAL_StatusTypeDef hal_state;
    *(ushort*)&uart0_buf[uart0_len] = from_little_endian_16(calc_crc(uart0_buf, uart0_len));
    uart0_len += 2;

    // 距接收经过的时间
    interval = timer_counter_read(TIMER5) - uart0_timestamp;

    // 如果发送距接收时间不足2ms, 等待
    if (interval < TWO_MS)
        Delay_us(TWO_MS - interval);

//将uart0_buf（usart0发送缓冲区）转给uart0_tx_ptr（发送指针）
#ifndef USE_BY_ISP
    uart0_tx_ptr = uart0_buf;
    hal_state = USART0_Send_Date(uart0_buf,uart0_len);//参数没用
#else
    uart0_tx_ptr = uart0_buf;
    sbuf0 = *uart0_tx_ptr++;
    USART_SendData(USART0, sbuf0);
    USART_ITConfig(USART0, USART_IT_TXE, ENABLE);//因为是 发送寄存器空 的中断，所以发完字符串后必须关掉，否则只
    --uart0_len;
#endif

    if(hal_state != HAL_OK)
            return 0;
    return 1;
}


